

<!DOCTYPE html>
<html lang="zh-CN" data-default-color-scheme=auto>



<head>
  <meta charset="UTF-8">
  <link rel="apple-touch-icon" sizes="76x76" href="/img/egg.png">
  <link rel="icon" href="/img/egg.png">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0, shrink-to-fit=no">
  <meta http-equiv="x-ua-compatible" content="ie=edge">
  
  <meta name="theme-color" content="#2f4154">
  <meta name="author" content="蛋炒饭">
  <meta name="keywords" content="">
  
    <meta name="description" content="学习目标：  能复述软件测试的定义：使用技术手段验证软件软件是否满足使用需求。  能说出 7 种 测试分类的区别： 123456789101112- 阶段划分   - 单元测试：针对源代码进行测试   - 集成测试：针对接口进行测试   - 系统测试：针对功能和非功能进行测试   - 验收测试：内侧、公测- 代码可见度划分   - 黑盒测试：不关注源代码针对功能测试（系统测试）   - 灰盒测试：">
<meta property="og:type" content="article">
<meta property="og:title" content="软件测试笔记1| 基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法">
<meta property="og:url" content="http://example.com/2024/03/31/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E7%AC%94%E8%AE%B01-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E3%80%81%E4%B8%BB%E6%B5%81%E6%8A%80%E8%83%BD%E3%80%81%E8%BD%AF%E6%B5%8B%E6%B5%81%E7%A8%8B%E3%80%81%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E3%80%81%E7%AD%89%E4%BB%B7%E7%B1%BB%E5%88%92%E5%88%86%E6%B3%95%E3%80%81%E8%BE%B9%E7%95%8C%E5%80%BC%E5%88%86%E6%9E%90%E6%B3%95%E3%80%81%E5%88%A4%E5%AE%9A%E8%A1%A8%E6%B3%95%E3%80%81%E9%94%99%E8%AF%AF%E6%8E%A8%E8%8D%90%E6%B3%95/index.html">
<meta property="og:site_name" content="十一的蛋炒饭的博客">
<meta property="og:description" content="学习目标：  能复述软件测试的定义：使用技术手段验证软件软件是否满足使用需求。  能说出 7 种 测试分类的区别： 123456789101112- 阶段划分   - 单元测试：针对源代码进行测试   - 集成测试：针对接口进行测试   - 系统测试：针对功能和非功能进行测试   - 验收测试：内侧、公测- 代码可见度划分   - 黑盒测试：不关注源代码针对功能测试（系统测试）   - 灰盒测试：">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281214756.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281218505.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281453723.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281455399.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403292230088.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403292318915.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403301502413.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403301516926.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021407547.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403302125922.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403302125922.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311352290.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311358916.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311403060.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311421998.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311437794.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021448666.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021450015.png">
<meta property="og:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021430384.png">
<meta property="article:published_time" content="2024-03-31T09:08:00.000Z">
<meta property="article:modified_time" content="2024-04-02T07:07:11.473Z">
<meta property="article:author" content="十一的蛋炒饭">
<meta property="article:tag" content="软件测试">
<meta property="article:tag" content="黑盒测试">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281214756.png">
  
  
  
  <title>软件测试笔记1| 基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法 - 十一的蛋炒饭的博客</title>

  <link  rel="stylesheet" href="https://lib.baomitu.com/twitter-bootstrap/4.6.1/css/bootstrap.min.css" />



  <link  rel="stylesheet" href="https://lib.baomitu.com/github-markdown-css/4.0.0/github-markdown.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/hint.css/2.7.0/hint.min.css" />

  <link  rel="stylesheet" href="https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.css" />



<!-- 主题依赖的图标库，不要自行修改 -->
<!-- Do not modify the link that theme dependent icons -->

<link rel="stylesheet" href="//at.alicdn.com/t/font_1749284_hj8rtnfg7um.css">



<link rel="stylesheet" href="//at.alicdn.com/t/font_1736178_lbnruvf0jn.css">


<link  rel="stylesheet" href="/css/main.css" />


  <link id="highlight-css" rel="stylesheet" href="/css/highlight.css" />
  
    <link id="highlight-css-dark" rel="stylesheet" href="/css/highlight-dark.css" />
  




  <script id="fluid-configs">
    var Fluid = window.Fluid || {};
    Fluid.ctx = Object.assign({}, Fluid.ctx)
    var CONFIG = {"hostname":"example.com","root":"/","version":"1.9.7","typing":{"enable":true,"typeSpeed":60,"cursorChar":"","loop":false,"scope":["home"]},"anchorjs":{"enable":true,"element":"h1,h2,h3,h4,h5,h6","placement":"left","visible":"hover","icon":"§"},"progressbar":{"enable":true,"height_px":3,"color":"#29d","options":{"showSpinner":false,"trickleSpeed":100}},"code_language":{"enable":true,"default":"TEXT"},"copy_btn":true,"image_caption":{"enable":true},"image_zoom":{"enable":true,"img_url_replace":["",""]},"toc":{"enable":true,"placement":"right","headingSelector":"h1,h2,h3,h4,h5,h6","collapseDepth":0},"lazyload":{"enable":true,"loading_img":"/img/loading.gif","onlypost":false,"offset_factor":2},"web_analytics":{"enable":false,"follow_dnt":true,"baidu":null,"google":{"measurement_id":null},"tencent":{"sid":null,"cid":null},"woyaola":null,"cnzz":null,"leancloud":{"app_id":null,"app_key":null,"server_url":null,"path":"window.location.pathname","ignore_local":false}},"search_path":"/local-search.xml","include_content_in_search":true};

    if (CONFIG.web_analytics.follow_dnt) {
      var dntVal = navigator.doNotTrack || window.doNotTrack || navigator.msDoNotTrack;
      Fluid.ctx.dnt = dntVal && (dntVal.startsWith('1') || dntVal.startsWith('yes') || dntVal.startsWith('on'));
    }
  </script>
  <script  src="/js/utils.js" ></script>
  <script  src="/js/color-schema.js" ></script>
  


  
<meta name="generator" content="Hexo 7.1.1"></head>


<body>
  

  <header>
    

<div class="header-inner" style="height: 70vh;">
  <nav id="navbar" class="navbar fixed-top  navbar-expand-lg navbar-dark scrolling-navbar">
  <div class="container">
    <a class="navbar-brand" href="/">
      <strong>十一的蛋炒饭 的博客</strong>
    </a>

    <button id="navbar-toggler-btn" class="navbar-toggler" type="button" data-toggle="collapse"
            data-target="#navbarSupportedContent"
            aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
      <div class="animated-icon"><span></span><span></span><span></span></div>
    </button>

    <!-- Collapsible content -->
    <div class="collapse navbar-collapse" id="navbarSupportedContent">
      <ul class="navbar-nav ml-auto text-center">
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/" target="_self">
                <i class="iconfont icon-home-fill"></i>
                <span>首页</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/archives/" target="_self">
                <i class="iconfont icon-archive-fill"></i>
                <span>归档</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/categories/" target="_self">
                <i class="iconfont icon-category-fill"></i>
                <span>分类</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/tags/" target="_self">
                <i class="iconfont icon-tags-fill"></i>
                <span>标签</span>
              </a>
            </li>
          
        
          
          
          
          
            <li class="nav-item">
              <a class="nav-link" href="/about/" target="_self">
                <i class="iconfont icon-user-fill"></i>
                <span>关于</span>
              </a>
            </li>
          
        
        
          <li class="nav-item" id="search-btn">
            <a class="nav-link" target="_self" href="javascript:;" data-toggle="modal" data-target="#modalSearch" aria-label="Search">
              <i class="iconfont icon-search"></i>
            </a>
          </li>
          
        
        
          <li class="nav-item" id="color-toggle-btn">
            <a class="nav-link" target="_self" href="javascript:;" aria-label="Color Toggle">
              <i class="iconfont icon-dark" id="color-toggle-icon"></i>
            </a>
          </li>
        
      </ul>
    </div>
  </div>
</nav>

  

<div id="banner" class="banner" parallax=true
     style="background: url('/img/win7.jpg') no-repeat center center; background-size: cover;">
  <div class="full-bg-img">
    <div class="mask flex-center" style="background-color: rgba(0, 0, 0, 0.3)">
      <div class="banner-text text-center fade-in-up">
        <div class="h2">
          
            <span id="subtitle">软件测试笔记1| 基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法</span>
          
        </div>

        
          
  <div class="mt-3">
    
    
      <span class="post-meta">
        <i class="iconfont icon-date-fill" aria-hidden="true"></i>
        <time datetime="2024-03-31 17:08" pubdate>
          2024年3月31日 下午
        </time>
      </span>
    
  </div>

  <div class="mt-1">
    
      <span class="post-meta mr-2">
        <i class="iconfont icon-chart"></i>
        
          8.5k 字
        
      </span>
    

    
      <span class="post-meta mr-2">
        <i class="iconfont icon-clock-fill"></i>
        
        
        
          71 分钟
        
      </span>
    

    
    
  </div>


        
      </div>

      
    </div>
  </div>
</div>

</div>

  </header>

  <main>
    
      

<div class="container-fluid nopadding-x">
  <div class="row nomargin-x">
    <div class="side-col d-none d-lg-block col-lg-2">
      
  <aside class="sidebar category-bar" style="margin-right: -1rem">
    





<div class="category-list">
  
  
    
    
    
    <div class="category row nomargin-x">
      <a class="category-item 
          list-group-item category-item-action col-10 col-md-11 col-xm-11" title="软件测试"
        id="heading-99a272194eb867ea363eec81b5e38d12" role="tab" data-toggle="collapse" href="#collapse-99a272194eb867ea363eec81b5e38d12"
        aria-expanded="true"
      >
        软件测试
        <span class="list-group-count">(2)</span>
        <i class="iconfont icon-arrowright"></i>
      </a>
      
      <div class="category-collapse collapse show" id="collapse-99a272194eb867ea363eec81b5e38d12"
           role="tabpanel" aria-labelledby="heading-99a272194eb867ea363eec81b5e38d12">
        
        
          
  <div class="category-post-list">
    
    
      
      
        <a href="/2024/03/31/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E7%AC%94%E8%AE%B01-%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5%E3%80%81%E4%B8%BB%E6%B5%81%E6%8A%80%E8%83%BD%E3%80%81%E8%BD%AF%E6%B5%8B%E6%B5%81%E7%A8%8B%E3%80%81%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E3%80%81%E7%AD%89%E4%BB%B7%E7%B1%BB%E5%88%92%E5%88%86%E6%B3%95%E3%80%81%E8%BE%B9%E7%95%8C%E5%80%BC%E5%88%86%E6%9E%90%E6%B3%95%E3%80%81%E5%88%A4%E5%AE%9A%E8%A1%A8%E6%B3%95%E3%80%81%E9%94%99%E8%AF%AF%E6%8E%A8%E8%8D%90%E6%B3%95/" title="软件测试笔记1| 基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法"
           class="list-group-item list-group-item-action
           active">
          <span class="category-post">软件测试笔记1| 基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法</span>
        </a>
      
    
      
      
        <a href="/2024/04/05/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E7%AC%94%E8%AE%B02-%E8%BD%AF%E4%BB%B6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E3%80%81%E7%BC%BA%E9%99%B7%E7%AE%A1%E7%90%86/" title="软件测试笔记2 | 软件生命周期、缺陷管理"
           class="list-group-item list-group-item-action
           ">
          <span class="category-post">软件测试笔记2 | 软件生命周期、缺陷管理</span>
        </a>
      
    
  </div>

        
      </div>
    </div>
  
</div>


  </aside>


    </div>

    <div class="col-lg-8 nopadding-x-md">
      <div class="container nopadding-x-md" id="board-ctn">
        <div id="board">
          <article class="post-content mx-auto">
            <h1 id="seo-header">软件测试笔记1| 基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法</h1>
            
              <p id="updated-time" class="note note-info" style="display: none">
                
                  
                    本文最后更新于 2024-04-02T15:07:11+08:00
                  
                  

                
              </p>
            
            
              <div class="markdown-body">
                
                <p><strong>学习目标：</strong></p>
<ol>
<li><p><strong>能复述软件测试的定义：</strong>使用技术手段验证软件软件是否满足使用需求。</p>
</li>
<li><p><strong>能说出 7 种 测试分类的区别</strong>：</p>
<figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs markdown"><span class="hljs-bullet">-</span> 阶段划分<br><span class="hljs-bullet">   -</span> 单元测试：针对源代码进行测试<br><span class="hljs-bullet">   -</span> 集成测试：针对接口进行测试<br><span class="hljs-bullet">   -</span> 系统测试：针对功能和非功能进行测试<br><span class="hljs-bullet">   -</span> 验收测试：内侧、公测<br><span class="hljs-bullet">-</span> 代码可见度划分<br><span class="hljs-bullet">   -</span> 黑盒测试：不关注源代码针对功能测试（系统测试）<br><span class="hljs-bullet">   -</span> 灰盒测试：针对接口进行测试（集成测试）<br><span class="hljs-bullet">   -</span> 白盒测试：针对源代码进行测试（单元测试）<br><span class="hljs-bullet">-</span> 专项<br><span class="hljs-bullet">   -</span> 性能测试<br><span class="hljs-bullet">   -</span> 安全测试<br></code></pre></td></tr></table></figure>


</li>
<li><p><strong>能说出质量模型的重点5项</strong>：功能、性能、兼容、易用、安全</p>
</li>
<li><p><strong>能说出测试流程的 6 个步骤</strong>：</p>
</li>
</ol>
<figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs markdown"><span class="hljs-bullet">1.</span> 需求评审<br><span class="hljs-bullet">  -</span> 角色 （产品经理、开发、测试）<br><span class="hljs-bullet">  -</span> 目的 （1、需求理解一致；2、知道被测项目有哪些模块）<br><span class="hljs-bullet">2.</span> 测试计划<br><span class="hljs-bullet">  -</span> 测什么<br><span class="hljs-bullet">  -</span> 谁来测<br><span class="hljs-bullet">  -</span> 怎么测<br><span class="hljs-bullet">3.</span> 用例设计<br><span class="hljs-bullet">  -</span> 针对穷举进行设计<br><span class="hljs-bullet">4.</span> 用例执行<br><span class="hljs-bullet">5.</span> 缺陷管理<br><span class="hljs-bullet">6.</span> 测试报告<br></code></pre></td></tr></table></figure>

<ol start="4">
<li><strong>能说出测试模板 8 个要素</strong></li>
</ol>
<figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><code class="hljs markdown"><span class="hljs-bullet">1.</span> 测试编号<br><span class="hljs-bullet">  -</span> 格式：项目简称<span class="hljs-emphasis">_模块简称_</span>编号<br><span class="hljs-bullet">2.</span> 用例标题<br><span class="hljs-bullet">  -</span> 格式: 预期结果（测试点）<br><span class="hljs-bullet">3.</span> 项目 / 模块<br><span class="hljs-bullet">  -</span> 用例所属项目或模块<br><span class="hljs-bullet">4.</span> 优先级<br><span class="hljs-bullet">  -</span> P0 ~ P4 (P0最高)<br><span class="hljs-bullet">5.</span> 前置条件 / 预置条件<br><span class="hljs-bullet">  -</span> 操作步骤之前的操作<br><span class="hljs-bullet">6.</span> 测试步骤<br><span class="hljs-bullet">  -</span> 执行用例步骤<br><span class="hljs-bullet">7.</span> 测试数据<br><span class="hljs-bullet">  -</span> 执行步骤中的重点数据<br><span class="hljs-bullet">8.</span> 预期结果 + 不同角色隐形结果<br></code></pre></td></tr></table></figure>

<ol start="5">
<li><strong>能针对穷举场景设计测试用例</strong></li>
</ol>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><code class="hljs python">- 方法： 等价类划分<br>    - 说明: <br>       - 有效等价：符合需求范围之内的为有效<br>       - 无效等价：符合需求范围之外的为无效<br>    - 用法：<br>       - 有效等价取<span class="hljs-number">1</span>个值<br>       - 每个无效集合取<span class="hljs-number">1</span>个<br>    - 重点： 验证类型<br>    - 难点：<br>       - 长度 —— 边界<br>       - 类型 —— 等价<br>       - 规则 —— 等价<br></code></pre></td></tr></table></figure>

<p><strong>6、能对限定边界规则设计测试点</strong></p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><code class="hljs python">- 方法： 边界值分析法<br> 	- 名词<br> 		- 上点 —— 边界上的点<br> 		- 离点 —— 距离上点最近的点<br> 		- 内点 —— 范围内的点<br> 	- 提示<br> 		- 使用边界对长度限制设计测试最多<span class="hljs-number">7</span>条用例，<br> 	 	- 优化：<span class="hljs-number">5</span>条<br> 	 		- 开区间(a, b)，取内离点<br> 	 		- 闭区间[a, b]，取外离点<br></code></pre></td></tr></table></figure>

<p><strong>7、能对多条件依赖关系进行设计测试点</strong></p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><code class="hljs python">- 判定表<br>	- 名词<br>    	- 条件桩 —— 将条件提取出来<br>        - 动作桩 —— 最后能产生结果清单<br>        - 条件项 —— 是是、是否、否是、否否<br>        - 动作项 —— √、×<br>    - 提示<br>    	- 多个条件未必有依赖关系<br>        	- 如：电话、地址<br>        - 只有多个条件依赖才使用判定表<br>        - <span class="hljs-number">2</span>的条件次方为用例个数<br></code></pre></td></tr></table></figure>



<h2 id="1、软件测试基本概念"><a href="#1、软件测试基本概念" class="headerlink" title="1、软件测试基本概念"></a>1、软件测试基本概念</h2><ul>
<li><strong>什么是软件</strong></li>
</ul>
<p>软件是指控制计算机硬件工作的工具。</p>
<p>比如应用软件（微信、购物应用）、系统软件（操作系统）</p>
<ul>
<li><strong>软件基本组成</strong></li>
</ul>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281214756.png" srcset="/img/loading.gif" lazyload alt="image-20240328121417555"></p>
<ul>
<li><strong>软件产生过程</strong></li>
</ul>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281218505.png" srcset="/img/loading.gif" lazyload alt="image-20240328121818205"></p>
<ul>
<li><strong>什么是软件测试</strong></li>
</ul>
<p><strong>软件测试：</strong>使用技术手段<strong>验证</strong>软件是否满足使用需求。</p>
<ul>
<li><strong>软件测试目的</strong></li>
</ul>
<p>减少软件缺陷（BUG），保障软件质量。</p>
<h2 id="2、测试主流技能"><a href="#2、测试主流技能" class="headerlink" title="2、测试主流技能"></a>2、测试主流技能</h2><ul>
<li><strong>功能测试</strong></li>
</ul>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281453723.png" srcset="/img/loading.gif" lazyload alt="image-20240328145354598"></p>
<p><strong>功能测试说明：</strong>功能测试主要验证程序的功能是否满足需求。</p>
<ul>
<li><strong>自动化测试</strong><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403281455399.png" srcset="/img/loading.gif" lazyload alt="image-20240328145548223"></li>
</ul>
<p><strong>自动化测试说明：</strong>使用代码或工具代替手工，对项目进行测试。</p>
<ul>
<li><strong>接口测试</strong></li>
</ul>
<p>工具实现（Postman）</p>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403292230088.png" srcset="/img/loading.gif" lazyload alt="image-20240329223029989"></p>
<ul>
<li><strong>性能测试</strong></li>
</ul>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403292318915.png" srcset="/img/loading.gif" lazyload alt="image-20240329231815818"></p>
<table>
<thead>
<tr>
<th>类型</th>
<th>描述</th>
<th>工具或技术</th>
<th>目的</th>
</tr>
</thead>
<tbody><tr>
<td>自动化测试</td>
<td>使用自动化工具和脚本来执行测试样例，以验证软件的功能、稳定性和性能。</td>
<td>Web应用测试：Selenium Web Driver ；移动应用测试：Appium；Java应用测试：JUnit 和 TestNG。测试脚本：Java、Python、JS。</td>
<td>提高测试效率、减少人工测试成本、增强测试覆盖率、支持持续集成和持续交付流程。</td>
</tr>
<tr>
<td>接口测试</td>
<td>验证软件组件之间的通信和数据交换的过程，确保它们按预期进行交互。</td>
<td>常见的接口测试工具：Postman、SoapUI、JMeter等。</td>
<td>通过接口测试，可以发现软件中潜在的问题和缺陷，确保系统各个组件之间的交互可以正常进行。</td>
</tr>
<tr>
<td>性能测试</td>
<td>评估软件系统性能的过程，包括响应时间、吞吐量、资源利用率等方面的测试。</td>
<td>性能测试工具：JMeter、LoadRunner、Gatling等。</td>
<td>识别系统的瓶颈和性能瓶颈，确保系统在预期负载下仍能提供良好的性能。</td>
</tr>
<tr>
<td>安全测试</td>
<td>评估软件的安全性，包括身份验证、授权、数据保护和漏洞扫描等方面的测试。</td>
<td>漏洞扫描器（防SQL注入、跨站脚本）：Nessus、OpenVAS；渗透测试（模拟攻击者行为，发现系统弱电和潜在的攻击面）：Metasploit。</td>
<td>评估软件系统的安全性，发现潜在的安全漏洞和风险，以及验证安全防护措施的有效性。</td>
</tr>
<tr>
<td>CI&#x2F;CD 测试</td>
<td>在持续集成和持续交付的过程中执行自动化测试，确保软件在不断集成和交付的过程中保证质量和稳定性。</td>
<td>持续集成：Jenkins、GitLab CI、容器化编排 Docker。</td>
<td>通过自动化和频繁的软件交付来提高开发效率、质量和可靠性。</td>
</tr>
</tbody></table>
<h2 id="3、常见测试分类"><a href="#3、常见测试分类" class="headerlink" title="3、常见测试分类"></a>3、常见测试分类</h2><p><strong>按测试阶段划分</strong></p>
<ol>
<li><strong>单元测试：</strong> 针对程序源代码进行测试。</li>
<li><strong>集成测试：</strong> 又称接口测试，针对模块之间访问地址进行测试。</li>
<li><strong>系统测试：</strong> 对整个系统进行测试，包括功能、兼容、文档等测试。</li>
<li><strong>验收测试：</strong> 使用不同用户测试，主要分为内侧、公测，使用不同人群来发掘项目缺陷。</li>
</ol>
<p><strong>按代码可见度划分</strong></p>
<table>
<thead>
<tr>
<th>分类</th>
<th>所在阶段</th>
<th>可见代码范围</th>
<th>功能范围</th>
<th>描述</th>
</tr>
</thead>
<tbody><tr>
<td>黑盒测试</td>
<td>系统测试</td>
<td>源代码</td>
<td>UI功能</td>
<td>不关注源代码，针对程序UI功能进行测试。</td>
</tr>
<tr>
<td>灰盒测试</td>
<td>集成（接口）测试</td>
<td>部分源代码</td>
<td>不可见功能</td>
<td>针对程序部分代码进行测试（接口）</td>
</tr>
<tr>
<td>白盒测试</td>
<td>单元测试</td>
<td>全部代码</td>
<td>不可见UI功能</td>
<td>针对程序源代码进行测试。</td>
</tr>
</tbody></table>
<p><strong>按被测试对象是否运行进行划分</strong></p>
<p>动态测试、静态测试（文档检查、代码走查）</p>
<p><strong>按不同的测试手段划分</strong></p>
<p>手工测试（点点点）、自动化测试（替代手工，用工具或者写代码）</p>
<p><strong>按测试包含的内容划分</strong></p>
<p>功能测试、界面测试、安全测试、兼容性测试、易用性测试、性能测试</p>
<p><strong>其他测试</strong></p>
<p>冒烟测试、回归测试、探索性测试 &#x2F; 自由测试（测试思维）</p>
<h2 id="4、质量模型"><a href="#4、质量模型" class="headerlink" title="4、质量模型"></a>4、质量模型</h2><p>质量模型：衡量一个优秀软件的维度。</p>
<p>质量模型有八个特性：</p>
<ul>
<li>功能性</li>
<li>性能</li>
<li>兼容性</li>
<li>易用性</li>
<li>可靠性</li>
<li>安全性</li>
<li>可维护性</li>
<li>可移植性</li>
</ul>
<p>质量模型提供了评估软件测试质量的框架和方法，帮助组织确定改进点并采取相应的措施。通过遵循这些质量模型，组织可以提高软件测试的效率、可靠性和效果，从而提高软件产品的质量和用户满意度。</p>
<h2 id="5、软件测试流程"><a href="#5、软件测试流程" class="headerlink" title="5、软件测试流程"></a>5、软件测试流程</h2><p><strong>软件测试流程一共有 6 步：</strong></p>
<ol>
<li><strong>需求评审</strong>：确保各部门需求理解一致。</li>
<li><strong>编写计划（测试）</strong>：测什么、谁来测、怎么测。</li>
<li><strong>用例设计</strong>：验证项目是否符合需求的操作文档。</li>
<li><strong>用例执行</strong>：项目模块开发完成后，开始执行用例文档实施测试。</li>
<li><strong>缺陷管理</strong>：对缺陷进行管理的过程。</li>
<li><strong>测试报告</strong>：实施测试结果文档。</li>
</ol>
<h2 id="6、测试用例"><a href="#6、测试用例" class="headerlink" title="6、测试用例"></a>6、测试用例</h2><h3 id="6-1-什么是测试用例"><a href="#6-1-什么是测试用例" class="headerlink" title="6.1 什么是测试用例"></a>6.1 什么是测试用例</h3><p><strong>用例：</strong>用户使用的案例。</p>
<p>测试用例：为了特定目的而设计的一组有测试输入、执行条件、预期结果的文档（案例）</p>
<p><strong>例子：对一个手机可有的用例：</strong></p>
<ul>
<li><p>是否能开机：打开手机按下电源键3秒，看是否能开机。</p>
</li>
<li><p>验证内存：打开手机查看内存是否为 64 G。</p>
</li>
<li><p>验证屏幕：打开手机在白屏背景下检查屏幕是否黑色点。</p>
</li>
<li><p>检查运行速度：打开手机下载吃鸡游戏，是否运行流畅。</p>
</li>
</ul>
<p><strong>测试用例：</strong> 是为测试项目而设计的执行<strong>文档</strong>。</p>
<h3 id="6-2-测试用例的作用"><a href="#6-2-测试用例的作用" class="headerlink" title="6.2 测试用例的作用"></a>6.2 测试用例的作用</h3><p>测试用例的作用有：</p>
<ul>
<li>防止漏测</li>
<li>实施测试的标准</li>
</ul>
<h3 id="6-3-测试用例的构成"><a href="#6-3-测试用例的构成" class="headerlink" title="6.3 测试用例的构成"></a>6.3 测试用例的构成</h3><p>测试用例的构成如下图：</p>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403301502413.png" srcset="/img/loading.gif" lazyload alt="image-20240330150233337"></p>
<p>通常包含 8 个要素， 如下表：</p>
<table>
<thead>
<tr>
<th>序号</th>
<th>测试用例属性</th>
<th>格式</th>
<th>例子（以用户登录为例）</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>用例编号（唯一）</td>
<td><code>项目_模块_编号</code></td>
<td><code>hm_login_001</code></td>
</tr>
<tr>
<td>2</td>
<td>用例标题</td>
<td><code>预期结果（测试点）</code></td>
<td><code>登录成功（正确手机号）</code></td>
</tr>
<tr>
<td>3</td>
<td>项目或模块</td>
<td><code>所属项目或模块</code></td>
<td><code>登录</code></td>
</tr>
<tr>
<td>4</td>
<td>优先级</td>
<td><code>表示用例的重要程度或者影响力（p0~p4) (p0最高)</code></td>
<td><code>P0</code></td>
</tr>
<tr>
<td>5</td>
<td>前置条件</td>
<td><code>要执行此条用例，有哪些前置操作</code></td>
<td><code>1、打开登录页面；2、手机号已注册；</code></td>
</tr>
<tr>
<td>6</td>
<td>测试步骤</td>
<td><code>描述操作步骤</code></td>
<td><code>1、输入手机号；2、点击发送验证码按钮；3、拖拽滑块验证成功；4、输入验证码；5、勾选协议；6、点击登录；</code></td>
</tr>
<tr>
<td>7</td>
<td>测试数据</td>
<td><code>操作的数据，没有的话可以为空</code></td>
<td><code>1、手机：已注册手机号；2、其他输入正确数据；</code></td>
</tr>
<tr>
<td>8</td>
<td>预期结果</td>
<td><code>预期达到的结果</code></td>
<td><code>1、手机文本框状态为绿色；2、登录成功，跳转到主页；</code></td>
</tr>
</tbody></table>
<h3 id="6-4-测试用例文档案例"><a href="#6-4-测试用例文档案例" class="headerlink" title="6.4 测试用例文档案例"></a>6.4 测试用例文档案例</h3><p>以 QQ登录为例，根据需求内容写一个测试文档：</p>
<img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403301516926.png" srcset="/img/loading.gif" lazyload alt="image-20240330151637851" style="zoom: 50%;" />


<table>
<thead>
<tr>
<th align="center">用例编号</th>
<th align="center">用例标题</th>
<th align="center">项目&#x2F;模块</th>
<th align="center">优先级</th>
<th align="center">前置条件</th>
<th align="center">测试步骤</th>
<th align="center">测试数据</th>
<th align="center">预期结果</th>
</tr>
</thead>
<tbody><tr>
<td align="center">QQ_login_001</td>
<td align="center">登录失败（账号为空）</td>
<td align="center">登录</td>
<td align="center">P1</td>
<td align="center">1、打开登录页面；2、网络正常</td>
<td align="center">1、输入账号；2、输入密码；3、点击登录按钮</td>
<td align="center">1、账号：空；2、密码：123456</td>
<td align="center">登录失败，提示：账号不可为空</td>
</tr>
<tr>
<td align="center">QQ_login_002</td>
<td align="center">登录失败（账号未注册）</td>
<td align="center">登录</td>
<td align="center">P1</td>
<td align="center">1、打开登录页面；2、网络正常；3、账号未注册</td>
<td align="center">1、输入账号；2、输入密码；3、点击登录按钮</td>
<td align="center">1、账号：未注册；2、密码：123456</td>
<td align="center">登录失败，提示：账号不存在</td>
</tr>
<tr>
<td align="center">QQ_login_003</td>
<td align="center">登录失败（密码为空）</td>
<td align="center">登录</td>
<td align="center">P1</td>
<td align="center">1、打开登录页面；2、网络正常；3、账号已注册</td>
<td align="center">1、输入账号；2、输入密码；3、点击登录按钮</td>
<td align="center">1、账号：已注册；2、密码：空</td>
<td align="center">登录失败，提示：密码不可为空</td>
</tr>
<tr>
<td align="center">QQ_login_004</td>
<td align="center">登录失败（密码错误）</td>
<td align="center">登录</td>
<td align="center">P1</td>
<td align="center">1、打开登录页面；2、网络正常；3、账号已注册</td>
<td align="center">1、输入账号；2、输入密码；3、点击登录按钮</td>
<td align="center">1、账号：已注册；2、密码：错误密码</td>
<td align="center">登录失败，提示：密码错误</td>
</tr>
</tbody></table>
<h2 id="7-、黑盒测试常见场景以及测试方法"><a href="#7-、黑盒测试常见场景以及测试方法" class="headerlink" title="7 、黑盒测试常见场景以及测试方法"></a>7 、黑盒测试常见场景以及测试方法</h2><p><strong>关于写测试点的四种技能要求：</strong></p>
<ul>
<li>能对穷举场景设计测试点 （等价类划分法）</li>
<li>能对限定边界规则设计测试点（边界值分析法）</li>
<li>能对多条件依赖关系进行设计测试点（判定表法）</li>
<li>能对于项目业务进行设计测试点（场景法）</li>
</ul>
<h3 id="7-1-穷举场景设计测试点"><a href="#7-1-穷举场景设计测试点" class="headerlink" title="7.1 穷举场景设计测试点"></a>7.1 穷举场景设计测试点</h3><h4 id="等价类划分法"><a href="#等价类划分法" class="headerlink" title="等价类划分法"></a>等价类划分法</h4><p><strong>等价类划分：</strong> 在所有的测试数据中，对具有某种共同特征的数据集合进行划分。</p>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021407547.png" srcset="/img/loading.gif" lazyload alt="image-20240402140729377"></p>
<p><strong>分类：</strong> </p>
<ul>
<li>有效等价类：满足需求的数据集合</li>
<li>无效等价类：不满足需求的数据集合</li>
</ul>
<p> <strong>步骤：</strong></p>
<ul>
<li>明确需求</li>
<li>确定有效和无效等价类</li>
<li>提取数据，编写测试用例</li>
</ul>
<p><code>注：上面的步骤是简单版本，下面有详细版本的等价类划分设计测试用例的步骤</code></p>
<figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><code class="hljs">第一步：分析需求，确定输入的数据类型<br><br>第二步：使用规则划分有效等价类和无效等价类<br><br>第三步：设计用例，覆盖有效等价类（一条用例尽可能多得覆盖有效等价类）<br><br>第四步：设计用例，覆盖无效等价类（一条用例只能覆盖一个无效等价类）<br></code></pre></td></tr></table></figure>



<p><strong>使用场景：</strong>需要有大量数据测试输入，但无法穷举测试的时候。</p>
<ul>
<li>输入框</li>
<li>下拉列表</li>
<li>单选框、复选框</li>
</ul>
<p><strong>典型代表：</strong>页面的输入框类测试。</p>
<p><code>注：完整的用例应是等价类和边界值一起写。</code></p>
<h5 id="案例——验证QQ账号的合法性"><a href="#案例——验证QQ账号的合法性" class="headerlink" title="案例——验证QQ账号的合法性"></a>案例——验证QQ账号的合法性</h5><p><strong>需求：</strong>验证QQ账号的合法性</p>
<p>要求：6 - 11位自然数</p>
<p><strong>第1步，明确需求</strong>：</p>
<table>
<thead>
<tr>
<th>长度</th>
<th>类型</th>
</tr>
</thead>
<tbody><tr>
<td>6-11位</td>
<td>自然数</td>
</tr>
</tbody></table>
<p><strong>第2步，划分有效等价类和无效等价类：</strong></p>
<table>
<thead>
<tr>
<th>有效</th>
<th>无效</th>
</tr>
</thead>
<tbody><tr>
<td>6-11位，自然数</td>
<td>&lt;6位，&gt;11位，非自然</td>
</tr>
</tbody></table>
<p><strong>第3步，提取数据编写用例：</strong></p>
<table>
<thead>
<tr>
<th>有效数据</th>
<th>无效数据</th>
</tr>
</thead>
<tbody><tr>
<td>123456789</td>
<td>12345、13456789012、123A、空</td>
</tr>
</tbody></table>
<p><strong>最后，</strong>写成测试用例：</p>
<table>
<thead>
<tr>
<th align="left">用例编号</th>
<th align="left">用例标题</th>
<th align="left">项目&#x2F;模块</th>
<th align="left">优先级</th>
<th align="left">前置条件</th>
<th align="left">测试步骤</th>
<th align="left">测试数据</th>
<th align="left">预期结果</th>
</tr>
</thead>
<tbody><tr>
<td align="left">QQ_001</td>
<td align="left">QQ合法（9位自然数）</td>
<td align="left">QQ账号</td>
<td align="left">p0</td>
<td align="left">打开验证QQ程序</td>
<td align="left">1、输入QQ号；2、点击验证</td>
<td align="left">账号：123456789</td>
<td align="left">QQ合法</td>
</tr>
<tr>
<td align="left">QQ_002</td>
<td align="left">QQ不合法（5位自然数）</td>
<td align="left">QQ账号</td>
<td align="left">p1</td>
<td align="left">打开验证QQ程序</td>
<td align="left">1、输入QQ号；2、点击验证</td>
<td align="left">账号：12345</td>
<td align="left">QQ不合法</td>
</tr>
<tr>
<td align="left">QQ_003</td>
<td align="left">QQ不合法（12位自然数）</td>
<td align="left">QQ账号</td>
<td align="left">p1</td>
<td align="left">打开验证QQ程序</td>
<td align="left">1、输入QQ号；2、点击验证</td>
<td align="left">账号：123456789012</td>
<td align="left">QQ不合法</td>
</tr>
<tr>
<td align="left">QQ_004</td>
<td align="left">QQ不合法（8位非自然数）</td>
<td align="left">QQ账号</td>
<td align="left">p1</td>
<td align="left">打开验证QQ程序</td>
<td align="left">1、输入QQ号；2、点击验证</td>
<td align="left">账号：1234567A</td>
<td align="left">QQ不合法</td>
</tr>
<tr>
<td align="left">QQ_005</td>
<td align="left">QQ不合法（为空）</td>
<td align="left">QQ账号</td>
<td align="left">p1</td>
<td align="left">打开验证QQ程序</td>
<td align="left">1、输入QQ号；2、点击验证</td>
<td align="left">账号：空</td>
<td align="left">QQ不合法</td>
</tr>
</tbody></table>
<h5 id="案例——验证某城市电话号码正确性"><a href="#案例——验证某城市电话号码正确性" class="headerlink" title="案例——验证某城市电话号码正确性"></a>案例——验证某城市电话号码正确性</h5><p><strong>要求：</strong></p>
<ol>
<li><strong>区号：</strong>空或者是三位数字。</li>
<li><strong>前缀码：</strong>非 “0” 且非 “1” 开头的三位数字。</li>
<li><strong>后缀码：</strong>四位数字。</li>
</ol>
<p><strong>第1步、明确需求</strong></p>
<table>
<thead>
<tr>
<th>长度</th>
<th>类型</th>
<th>规则</th>
</tr>
</thead>
<tbody><tr>
<td>3+3+4&#x3D;10位</td>
<td>自然数</td>
<td>三个规则（区号、前缀码、后缀码）</td>
</tr>
</tbody></table>
<p><strong>第2步，确定有效等价类和无效等价类</strong></p>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
<th>有效</th>
<th>无效</th>
</tr>
</thead>
<tbody><tr>
<td>区号</td>
<td>长度</td>
<td>空、3位</td>
<td>非3位</td>
</tr>
<tr>
<td>前缀码</td>
<td>长度</td>
<td>3位</td>
<td>非3位</td>
</tr>
<tr>
<td>后缀码</td>
<td>长度</td>
<td>4位</td>
<td>非4位</td>
</tr>
<tr>
<td>区号</td>
<td>类型</td>
<td>数字</td>
<td>非数字</td>
</tr>
<tr>
<td>前缀码</td>
<td>类型</td>
<td>数字</td>
<td>非数字</td>
</tr>
<tr>
<td>后缀码</td>
<td>类型</td>
<td>数字</td>
<td>非数字</td>
</tr>
<tr>
<td>区号</td>
<td>规则</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
</tr>
<tr>
<td>前缀码</td>
<td>规则</td>
<td>非0且非1开头</td>
<td>1、0开头；2、1开头</td>
</tr>
<tr>
<td>后缀码</td>
<td>规则</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
</tr>
</tbody></table>
<p><strong>第3步，提取数据</strong>，编写测试用例（基于上面的表）</p>
<table>
<thead>
<tr>
<th>参数</th>
<th>说明</th>
<th>有效</th>
<th>有效数据</th>
<th>无效</th>
<th>无效数据</th>
</tr>
</thead>
<tbody><tr>
<td>区号</td>
<td>长度</td>
<td>空、3位</td>
<td>1、空；2、123</td>
<td>非3位</td>
<td>12</td>
</tr>
<tr>
<td>前缀码</td>
<td>长度</td>
<td>3位</td>
<td>123</td>
<td>非3位</td>
<td>1234</td>
</tr>
<tr>
<td>后缀码</td>
<td>长度</td>
<td>4位</td>
<td>1234</td>
<td>非4位</td>
<td>123</td>
</tr>
<tr>
<td>区号</td>
<td>类型</td>
<td>数字</td>
<td>&#x2F;</td>
<td>非数字</td>
<td>12A</td>
</tr>
<tr>
<td>前缀码</td>
<td>类型</td>
<td>数字</td>
<td>&#x2F;</td>
<td>非数字</td>
<td>23A</td>
</tr>
<tr>
<td>后缀码</td>
<td>类型</td>
<td>数字</td>
<td>&#x2F;</td>
<td>非数字</td>
<td>123A</td>
</tr>
<tr>
<td>区号</td>
<td>规则</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
<td>12A</td>
</tr>
<tr>
<td>前缀码</td>
<td>规则</td>
<td>非0且非1开头</td>
<td>&#x2F;</td>
<td>1、0开头；2、1开头</td>
<td>1、012；2、123</td>
</tr>
<tr>
<td>后缀码</td>
<td>规则</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
</tr>
</tbody></table>
<p>根据电话是 <code>区号+前缀码+后缀码</code> 的组合， 我们可以看到有效数据中有两个数据，空+123+1234、123+123+1234；而无效数据中无法组合，就是八个，加起来一共有十个数据，所以就有十个测试用例。</p>
<p>最后，写成测试用例：</p>
<table>
<thead>
<tr>
<th>用例编号</th>
<th>用例标题</th>
<th>项目&#x2F;模块</th>
<th>优先级</th>
<th>前置条件</th>
<th>测试步骤</th>
<th>测试数据</th>
<th>预期结果</th>
</tr>
</thead>
<tbody><tr>
<td><code>tel_001</code></td>
<td>合法（区号为空+其他正确）</td>
<td>电话</td>
<td>p0</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：234；3、后缀：1234</td>
<td>合法</td>
</tr>
<tr>
<td><code>tel_002</code></td>
<td>合法（区号为3位数字+其他正确）</td>
<td>电话</td>
<td>p0</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：123；2、前缀：234；3、后缀：1234</td>
<td>合法</td>
</tr>
<tr>
<td><code>tel_003</code></td>
<td>不合法（区号为2位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：234；3、后缀：1234</td>
<td>不合法</td>
</tr>
<tr>
<td><code>tel_004</code></td>
<td>不合法（前缀为非0且非1开头的2位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：23；3、后缀：1234</td>
<td>不合法</td>
</tr>
<tr>
<td><code>tel_005</code></td>
<td>不合法（后缀为3位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：234；3、后缀：123</td>
<td>不合法</td>
</tr>
<tr>
<td><code>tel_006</code></td>
<td>不合法（区号为非3位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：12A；2、前缀：234；3、后缀：1234</td>
<td>不合法</td>
</tr>
<tr>
<td><code>tel_007</code></td>
<td>不合法（前缀为非0且非1开头的非3位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：23A；3、后缀：1234</td>
<td>不合法</td>
</tr>
<tr>
<td><code>tel_008</code></td>
<td>不合法（后缀非4位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：23A；3、后缀：123A</td>
<td>不合法</td>
</tr>
<tr>
<td><code>tel_009</code></td>
<td>不合法（前缀为0开头的3位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：012；3、后缀：123A</td>
<td>不合法</td>
</tr>
<tr>
<td><code>tel_010</code></td>
<td>不合法（前缀为1开头的3位数字+其他正确）</td>
<td>电话</td>
<td>p1</td>
<td>打开验证电话程序</td>
<td>1、输入区号；2、输入前缀；3、输入后缀；4、点击验证</td>
<td>1、区号：空；2、前缀：123；3、后缀：123A</td>
<td>不合法</td>
</tr>
</tbody></table>
<h3 id="7-2-限定边界规则设计测试点"><a href="#7-2-限定边界规则设计测试点" class="headerlink" title="7.2 限定边界规则设计测试点"></a>7.2 限定边界规则设计测试点</h3><h4 id="边界值分析法"><a href="#边界值分析法" class="headerlink" title="边界值分析法"></a>边界值分析法</h4><p>学习流程：边界范围节点 -&gt; 应用设计步骤 -&gt; 案例 -&gt; 适用场景</p>
<p><strong>边界范围节点：</strong> 选取刚好等于、刚好大于、刚好小于边界的值作为测试数据。</p>
<ul>
<li><strong>上点：</strong>边界上的点（刚好等于）</li>
<li><strong>高点：</strong>距离上点最近的点（刚好大于、刚好小于）</li>
<li><strong>内点：</strong>范围内的点（区间范围内的数据）</li>
</ul>
<p><strong>例子：</strong>绿色上点、黄色高点、蓝色内点</p>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403302125922.png" srcset="/img/loading.gif" lazyload alt="image-20240330212554840"></p>
<p><strong>边界值法设计用例步骤：</strong></p>
<ol>
<li>明确需求</li>
<li>确定有效和无效等价类</li>
<li>确定边界范围值</li>
<li>提取数据编写测试用例</li>
</ol>
<p><strong>使用场景：</strong></p>
<ul>
<li>在等价类的基础上针对有边界范围的测试数据输入的地方（重点关注边界）</li>
<li>常见词语描述：大小、尺寸、重量、最大、最小、至多、至少等修饰词语。</li>
<li>典型代表：有边界范围的输入框类测试。</li>
</ul>
<h5 id="案例——验证标题长度合法性"><a href="#案例——验证标题长度合法性" class="headerlink" title="案例——验证标题长度合法性"></a>案例——验证标题长度合法性</h5><p><strong>需求：</strong> 通过边界值法验证标题长度的合法性。</p>
<p><strong>要求：</strong>标题长度大于0，小于等于30个字符。</p>
<p><strong>第1步，明确需求：</strong></p>
<table>
<thead>
<tr>
<th>类型</th>
<th>范围</th>
</tr>
</thead>
<tbody><tr>
<td>字符</td>
<td>(0, 30]</td>
</tr>
</tbody></table>
<p><strong>第2步，确定有效和无效等价类：</strong></p>
<table>
<thead>
<tr>
<th>有效等价</th>
<th>无效等价</th>
</tr>
</thead>
<tbody><tr>
<td>大于0且小于等于30个字符</td>
<td>大于0且小于等于30个数字</td>
</tr>
</tbody></table>
<p><strong>第3步，确定边界范围值</strong></p>
<table>
<thead>
<tr>
<th>上点</th>
<th>离点</th>
<th>内点</th>
</tr>
</thead>
<tbody><tr>
<td>0位, 30位</td>
<td>1位,-1位（不存在）， 29位, 31位</td>
<td>15位</td>
</tr>
</tbody></table>
<p>最后，确定测试用例：</p>
<table>
<thead>
<tr>
<th>用例编号</th>
<th>用例标题</th>
<th>项目&#x2F;模块</th>
<th>优先级</th>
<th>前置条件</th>
<th>测试步骤</th>
<th>测试数据</th>
<th>预期结果</th>
</tr>
</thead>
<tbody><tr>
<td><code>title_001</code></td>
<td>不合法（15位非字符串）</td>
<td>标题</td>
<td>p1</td>
<td>打开标题验证程序</td>
<td>1、输入标题；2、点击验证</td>
<td>标题，15位数字</td>
<td>不合法</td>
</tr>
<tr>
<td><code>title_002</code></td>
<td>合法（标题为15位字符）</td>
<td>标题</td>
<td>p0</td>
<td>打开标题验证程序</td>
<td>1、输入标题；2、点击验证</td>
<td>标题，15位字符</td>
<td>合法</td>
</tr>
<tr>
<td><code>title_003</code></td>
<td>合法（标题为30位字符）</td>
<td>标题</td>
<td>p0</td>
<td>打开标题验证程序</td>
<td>1、输入标题；2、点击验证</td>
<td>标题，30位字符</td>
<td>合法</td>
</tr>
<tr>
<td><code>title_004</code></td>
<td>不合法（标题为空）</td>
<td>标题</td>
<td>p1</td>
<td>打开标题验证程序</td>
<td>1、输入标题；2、点击验证</td>
<td>标题，空</td>
<td>不合法</td>
</tr>
<tr>
<td><code>title_005</code></td>
<td>合法（标题为29位字符）</td>
<td>标题</td>
<td>p1</td>
<td>打开标题验证程序</td>
<td>1、输入标题；2、点击验证</td>
<td>标题，29位字符</td>
<td>合法</td>
</tr>
<tr>
<td><code>title_006</code></td>
<td>不合法（标题为31位字符）</td>
<td>标题</td>
<td>p1</td>
<td>打开标题验证程序</td>
<td>1、输入标题；2、点击验证</td>
<td>标题，31位字符</td>
<td>不合法</td>
</tr>
<tr>
<td><code>title_007</code></td>
<td>合法（标题为1位字符）</td>
<td>标题</td>
<td>p0</td>
<td>打开标题验证程序</td>
<td>1、输入标题；2、点击验证</td>
<td>标题，a</td>
<td>合法</td>
</tr>
</tbody></table>
<h5 id="案例——验证QQ账号的合法性-1"><a href="#案例——验证QQ账号的合法性-1" class="headerlink" title="案例——验证QQ账号的合法性"></a>案例——验证QQ账号的合法性</h5><p><strong>需求：</strong>通过边界值法验证QQ号码的合法性</p>
<p><strong>要求：</strong>6-10位自然数</p>
<p><strong>第1步，明确需求</strong></p>
<table>
<thead>
<tr>
<th>长度</th>
<th>类型</th>
</tr>
</thead>
<tbody><tr>
<td>6-10位</td>
<td>自然数</td>
</tr>
</tbody></table>
<p><strong>第2步，确定有效等价类和无效等价类</strong></p>
<table>
<thead>
<tr>
<th>有效等价类</th>
<th>无效等价类</th>
</tr>
</thead>
<tbody><tr>
<td>自然数</td>
<td>非自然数</td>
</tr>
</tbody></table>
<p><strong>第3步，确定边界范围值</strong></p>
<table>
<thead>
<tr>
<th>上点</th>
<th>高点</th>
<th>内点</th>
</tr>
</thead>
<tbody><tr>
<td>6、10</td>
<td>5、7、9、11</td>
<td>8</td>
</tr>
</tbody></table>
<p><strong>第4步，提取数据编写测试用例</strong></p>
<table>
<thead>
<tr>
<th>用例编号</th>
<th>用例标题</th>
<th>项目&#x2F;模块</th>
<th>优先级</th>
<th>前置条件</th>
<th>测试步骤</th>
<th>测试数据</th>
<th>预期结果</th>
</tr>
</thead>
<tbody><tr>
<td><code>qq_001</code></td>
<td>不合法（8位非自然数）</td>
<td>QQ账号</td>
<td>p1</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>1234567a</td>
<td>不合法</td>
</tr>
<tr>
<td><code>qq_002</code></td>
<td>合法（8位自然数）</td>
<td>QQ账号</td>
<td>p0</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>12345678</td>
<td>合法</td>
</tr>
<tr>
<td><code>qq_003</code></td>
<td>不合法（11位自然数）</td>
<td>QQ账号</td>
<td>p1</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>12345678901</td>
<td>不合法</td>
</tr>
<tr>
<td><code>qq_004</code></td>
<td>合法（9位自然数）</td>
<td>QQ账号</td>
<td>p0</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>123456789</td>
<td>合法</td>
</tr>
<tr>
<td><code>qq_005</code></td>
<td>合法（7位自然数）</td>
<td>QQ账号</td>
<td>p0</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>1234567</td>
<td>合法</td>
</tr>
<tr>
<td><code>qq_006</code></td>
<td>不合法（5位自然数）</td>
<td>QQ账号</td>
<td>p1</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>12345</td>
<td>合法</td>
</tr>
<tr>
<td><code>qq_007</code></td>
<td>合法（10位自然数）</td>
<td>QQ账号</td>
<td>p0</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>1234567890</td>
<td>合法</td>
</tr>
<tr>
<td><code>qq_008</code></td>
<td>合法（6位自然数）</td>
<td>QQ账号</td>
<td>p0</td>
<td>打开QQ验证程序</td>
<td>1、输入QQ号；2、点击验证</td>
<td>123456</td>
<td>合法</td>
</tr>
</tbody></table>
<h5 id="边界值分析法的优化"><a href="#边界值分析法的优化" class="headerlink" title="边界值分析法的优化"></a>边界值分析法的优化</h5><p>在开始部分，介绍了上点、离点和内点的概念，假设要取-99到99的值，则会有以下几个点：（绿色上点、黄色高点、蓝色内点）</p>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403302125922.png" srcset="/img/loading.gif" lazyload alt="image-20240330212554840"></p>
<p>在上图中共有七个点，实际上可以优化为五个点</p>
<p><strong>上点：</strong>必选（不考虑区间开闭）</p>
<p><strong>内点：</strong>必选（建议选中间范围）</p>
<p><strong>离点：</strong>开内闭外（考虑开闭区间，开区间选择内部离点，闭区间选择外部离点）</p>
<p>（注：开区间(a,b) 指不包含，闭区间[a, b] 指包含）</p>
<p>即不包含则选择内离点，包含则选择外离点。</p>
<p>由于是初学，上面两个案例并没有优化。</p>
<h3 id="7-3-对多条件依赖关系设计测试点"><a href="#7-3-对多条件依赖关系设计测试点" class="headerlink" title="7.3 对多条件依赖关系设计测试点"></a>7.3 对多条件依赖关系设计测试点</h3><h4 id="判定表法"><a href="#判定表法" class="headerlink" title="判定表法"></a>判定表法</h4><p><strong>案例：</strong>验证“若用户欠费或者关机，则不允许主被叫”功能的测试。</p>
<p><strong>说明：</strong> 等价类边界值分析法主要关注<strong>单个输入类</strong>条件的测试，但<strong>未考虑</strong>输入条件之间的各种组合、输入条件与输出结果之间有<strong>相互制约关系</strong>的测试。</p>
<table>
<thead>
<tr>
<th>条件</th>
<th>是否欠费</th>
<th>是</th>
<th>是</th>
<th>否</th>
<th>否</th>
</tr>
</thead>
<tbody><tr>
<td>条件</td>
<td>是否关机</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>否</td>
</tr>
<tr>
<td>操作</td>
<td>是否允许主被叫</td>
<td>否</td>
<td>否</td>
<td>否</td>
<td>是</td>
</tr>
</tbody></table>
<p><strong>判定表定义及组成部分：</strong></p>
<p><strong>定义：</strong>是一种以 <strong>表格形式</strong> 表达多条件逻辑判断的工具。</p>
<p><strong>组成：</strong> </p>
<ul>
<li><strong>条件桩：</strong>列出问题中的所有条件，列出条件的次序无关紧要。</li>
<li><strong>动作桩：</strong> 列出问题中可能采取的操作，操作的排序顺序没有约束。</li>
<li><strong>条件项：</strong> 列出条件对应的取值，所有可能情况下的真假值。</li>
<li><strong>动作项：</strong>列出条件项的、各种取值情况下应该采取的动作结果。</li>
</ul>
<p><strong>判定表法设计用例步骤：</strong></p>
<ol>
<li>明确需求</li>
<li>画判定表</li>
<li>提取数据，编写用例</li>
</ol>
<p><strong>规则：</strong></p>
<ul>
<li>判断表中贯穿条件项和动作项的一列就是一条规则。</li>
<li>假设有 n 个条件，每个条件的取值有 （0,1）个，全组合有 $2^n$ 次方种规则。</li>
</ul>
<p><strong>使用场景：</strong></p>
<ul>
<li>有多个输入条件，多个输出结果，输入条件之间有<strong>组合</strong>关系，输入条件和输出结果之间有依赖（制约）关系</li>
<li>判定表一般适用于条件组合<strong>数量较少</strong>的情况（比如四个条件以下）</li>
</ul>
<figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs markdown">提示：<br><span class="hljs-bullet">	1.</span> 多条件之间有依赖关系，使用判定表来进行测试覆盖。<br><span class="hljs-bullet">	2.</span> 判定表一般适合4个以内的条件依赖关系。<br><span class="hljs-bullet">	3.</span> 如果条件超过4个，就不适合覆盖所有条件，应采用（正交法）来解决。<br></code></pre></td></tr></table></figure>



<h5 id="案例——订购单检查"><a href="#案例——订购单检查" class="headerlink" title="案例——订购单检查"></a>案例——订购单检查</h5><p><strong>规则：</strong></p>
<p>1）若金额大于 500 元，又未过期，则发出批准单和提货单；</p>
<p>2）若金额大于 500 元，但过期了，则不发批准单与提货单；</p>
<p>3）若金额小于等于 500 元，则不论是否过期都发出批准单和提货单。</p>
<p>4）在过期的情况下不论金额大小都需要发出通知单。</p>
<p><strong>第1步，明确需求</strong></p>
<table>
<thead>
<tr>
<th>条件桩</th>
<th>动作桩</th>
</tr>
</thead>
<tbody><tr>
<td>金额是否大于500元、订购单是否过期</td>
<td>发批准单、发提货单、发通知单</td>
</tr>
</tbody></table>
<p><strong>第2步，画判定表</strong></p>
<table>
<thead>
<tr>
<th>条件项</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>是否大于500</td>
<td>是</td>
<td>是</td>
<td>否</td>
<td>否</td>
</tr>
<tr>
<td>是否过期</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>否</td>
</tr>
<tr>
<td><strong>动作项</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>批准单</td>
<td>不发</td>
<td>发</td>
<td>发</td>
<td>发</td>
</tr>
<tr>
<td>提货单</td>
<td>不发</td>
<td>发</td>
<td>发</td>
<td>发</td>
</tr>
<tr>
<td>通知单</td>
<td>发</td>
<td>不发</td>
<td>发</td>
<td>不发</td>
</tr>
</tbody></table>
<p><strong>第3步，提取数据，编写用例</strong></p>
<table>
<thead>
<tr>
<th>用例编号</th>
<th>用例标题</th>
<th>项目&#x2F;模块</th>
<th>优先级</th>
<th>前置条件</th>
<th>测试步骤</th>
<th>测试数据</th>
<th>预期结果</th>
</tr>
</thead>
<tbody><tr>
<td><code>order_001</code></td>
<td>发通知单（ 金额大于500元，过期）</td>
<td>订单</td>
<td>p0</td>
<td>打开订购单</td>
<td>1、输入金额；2、输入是否过期；3、点击验证按钮</td>
<td>金额：600；是否过期：过期</td>
<td>发通知单，不发批准单和提货单</td>
</tr>
<tr>
<td><code>order_002</code></td>
<td>发批准单、提货单（ 金额大于500元，未过期）</td>
<td>订单</td>
<td>p0</td>
<td>打开订购单</td>
<td>1、输入金额；2、输入是否过期；3、点击验证按钮</td>
<td>金额：600；是否过期：未过期</td>
<td>发批准单、提货单，不发通知单</td>
</tr>
<tr>
<td><code>order_003</code></td>
<td>发通知单、批准单、提货单（ 金额小于或等于500元，过期）</td>
<td>订单</td>
<td>p0</td>
<td>打开订购单</td>
<td>1、输入金额；2、输入是否过期；3、点击验证按钮</td>
<td>金额：500；是否过期：过期</td>
<td>发通知单、批准单和提货单</td>
</tr>
<tr>
<td><code>order_004</code></td>
<td>发批准单、提货单（ 小于500，未过期）</td>
<td>订单</td>
<td>p0</td>
<td>打开订购单</td>
<td>1、输入金额；2、输入是否过期；3、点击验证按钮</td>
<td>金额：400；是否过期：未过期</td>
<td>发通知单，不发批准单和提货单</td>
</tr>
</tbody></table>
<h5 id="案例——文件修改规则"><a href="#案例——文件修改规则" class="headerlink" title="案例——文件修改规则"></a>案例——文件修改规则</h5><p><strong>规则：</strong></p>
<p>1）输入的第一列字符必须是 A 或 B</p>
<p>2）第二列字符必须是一个数字</p>
<p>3）如果第一列字符不正确、则给出信息 L</p>
<p>4）如果第二列字符不正确，则给出信息 M</p>
<p>5）如果两列字符输入正确，则修改文件成功</p>
<p><strong>第1步，明确需求</strong></p>
<table>
<thead>
<tr>
<th>条件桩</th>
<th>动作桩</th>
</tr>
</thead>
<tbody><tr>
<td>第一列字符，第二列字符</td>
<td>发送信息L，发送信息M，发送修改文件成功</td>
</tr>
</tbody></table>
<p><strong>第2步，画判定表</strong></p>
<table>
<thead>
<tr>
<th>条件项</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody><tr>
<td>第一列字符是A或B</td>
<td>是</td>
<td>是</td>
<td>否</td>
<td>否</td>
</tr>
<tr>
<td>第二列字符是数字</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>否</td>
</tr>
<tr>
<td><strong>动作项</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td>输出L</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
<td>√</td>
<td>√</td>
</tr>
<tr>
<td>输出M</td>
<td>&#x2F;</td>
<td>√</td>
<td>&#x2F;</td>
<td>√</td>
</tr>
<tr>
<td>文件修改成功</td>
<td>√</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
</tr>
</tbody></table>
<p><strong>第3步，提取数据设计测试用例</strong></p>
<table>
<thead>
<tr>
<th>用例编号</th>
<th>用例标题</th>
<th>项目&#x2F;模块</th>
<th>优先级</th>
<th>前置条件</th>
<th>测试步骤</th>
<th>测试数据</th>
<th>预期结果</th>
</tr>
</thead>
<tbody><tr>
<td><code>file_001</code></td>
<td>文件修改成功（ 第一列字符是A或B，第二列字符是数字）</td>
<td>文件</td>
<td>p0</td>
<td>打开文件修改工具</td>
<td>1、输入第一列；2、输入第二列；3、点击验证按钮</td>
<td>第一列：A；第二列：1</td>
<td>文件修改成功</td>
</tr>
<tr>
<td><code>file_002</code></td>
<td>输出M（第一列是A或B，第二列不是数字）</td>
<td>文件</td>
<td>p1</td>
<td>打开文件修改工具</td>
<td>1、输入第一列；2、输入第二列；3、点击验证按钮</td>
<td>第一列：A；第二列：A</td>
<td>输出M</td>
</tr>
<tr>
<td><code>file_003</code></td>
<td>输出L（第一列不是A或B，第二列是数字）</td>
<td>文件</td>
<td>p1</td>
<td>打开文件修改工具</td>
<td>1、输入第一列；2、输入第二列；3、点击验证按钮</td>
<td>第一列：C；第二列：1</td>
<td>输出L</td>
</tr>
<tr>
<td><code>file_004</code></td>
<td>输出L、M（第一列不是A或B，第二列不是数字）</td>
<td>文件</td>
<td>p1</td>
<td>打开文件修改工具</td>
<td>1、输入第一列；2、输入第二列；3、点击验证按钮</td>
<td>第一列：C；第二列：a</td>
<td>输出L、M</td>
</tr>
</tbody></table>
<h3 id="7-4-对项目业务设计测试用例"><a href="#7-4-对项目业务设计测试用例" class="headerlink" title="7.4 对项目业务设计测试用例"></a>7.4 对项目业务设计测试用例</h3><p><strong>重点：</strong></p>
<ul>
<li>覆盖业务测试，需要使用流程图法</li>
<li>先测试业务，再测试单功能、单模块、单页面</li>
</ul>
<h4 id="流程图"><a href="#流程图" class="headerlink" title="流程图"></a>流程图</h4><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs">提示： 业务用例是根据流程图来梳理的，所以需要先了解流程图。<br></code></pre></td></tr></table></figure>

<p><strong>流程图：</strong>使用标准图形和箭头来表达程序或业务的走向，如图下图所示</p>
<img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311352290.png" srcset="/img/loading.gif" lazyload alt="image-20240331135220195" style="zoom: 67%;" />



<p>流程图对测试人员的作用：</p>
<ul>
<li>通过流程图可以设计业务用例</li>
<li>当需求文档不全面时，可以根据需求，梳理出流程。</li>
</ul>
<p>流程图作用总结：梳理业务用例。</p>
<p>流程图网页工具：<a target="_blank" rel="noopener" href="https://www.processon.com/">https://www.processon.com/</a></p>
<p>流程图Windows工具：Visio</p>
<p><strong>流程图案例1：</strong>用户登录，当用户名为admin且密码为123456时，输出：登录成功</p>
<img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311358916.png" srcset="/img/loading.gif" lazyload alt="image-20240331135843853" style="zoom:80%;" />

<p><strong>流程图案例2：</strong>登录、搜索商品、添加购物车、去结算、支付、如果支付成功、则提示下单成功，否则提示支付失败。</p>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311403060.png" srcset="/img/loading.gif" lazyload alt="image-20240331140357998"></p>
<h4 id="场景法"><a href="#场景法" class="headerlink" title="场景法"></a>场景法</h4><p>场景法也可以叫做流程图法，是用流程图描述用户的使用场景，然后通过覆盖流程路径来设计测试用例。</p>
<p><strong>意义：</strong></p>
<ul>
<li><strong>用户使用角度：</strong>用户平时使用的不是单个功能，而是多个功能组合起来进行使用。</li>
<li><strong>测试人员角度：</strong>平时测试的都是单个功能点进行测试，容易忽略多个功能的组合测试。</li>
</ul>
<h5 id="案例-——-ATM-机取款流程"><a href="#案例-——-ATM-机取款流程" class="headerlink" title="案例 —— ATM 机取款流程"></a>案例 —— ATM 机取款流程</h5><p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311421998.png" srcset="/img/loading.gif" lazyload alt="image-20240331142100921"></p>
<p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202403311437794.png" srcset="/img/loading.gif" lazyload alt="未命名文件"></p>
<ol>
<li>开始 -&gt; 验证银行卡不成功 -&gt; 结束</li>
<li>开始 -&gt; 验证银行卡成功 -&gt; 密码错误3次 -&gt; 结束</li>
<li>开始 -&gt; 验证银行卡成功 -&gt; 密码验证成功 -&gt;  账户余额不足 -&gt; 结束</li>
<li>开始 -&gt; 验证银行卡成功 -&gt; 密码验证成功 -&gt; 账户余额验证成功 -&gt; 取款金额不正确 -&gt; 结束</li>
<li>开始 -&gt; 验证银行卡成功 -&gt; 密码验证成功 -&gt; 账户余额验证成功 -&gt; 取款金额正确 -&gt;  ATM 机余额不足 -&gt;  结束</li>
<li>开始 -&gt; 验证银行卡成功 -&gt; 密码验证成功 -&gt; 账户余额验证成功 -&gt; 取款金额正确 -&gt; ATM 机余额充足 -&gt; 取款成功 -&gt; 结束</li>
</ol>
<table>
<thead>
<tr>
<th>用例编号</th>
<th>用例标题</th>
<th>项目&#x2F;模块</th>
<th>优先级</th>
<th>前置条件</th>
<th>测试步骤</th>
<th>测试数据</th>
<th>预期结果</th>
</tr>
</thead>
<tbody><tr>
<td><code>ATM_001</code></td>
<td>取款失败（非银行卡）</td>
<td>ATM</td>
<td>P1</td>
<td>打开 ATM 验证程序</td>
<td>1、插入卡</td>
<td>卡：非银行卡</td>
<td>取款失败，提示：非银行卡，退卡</td>
</tr>
<tr>
<td><code>ATM_002</code></td>
<td>取款失败（密码错误3次）</td>
<td>ATM</td>
<td>P1</td>
<td>打开 ATM 验证程序</td>
<td>1、插入卡；2、输入密码</td>
<td>卡：银行卡；密码：错误密码</td>
<td>取款失败，提示：密码错误3次，吞卡</td>
</tr>
<tr>
<td><code>ATM_003</code></td>
<td>取款失败（账户余额不足）</td>
<td>ATM</td>
<td>P1</td>
<td>1、打开 ATM 验证程序；2、卡余额为0</td>
<td>1、插入卡；2、输入密码</td>
<td>卡：银行卡；密码：正确密码</td>
<td>取款失败，提示：卡余额为0，退卡</td>
</tr>
<tr>
<td><code>ATM_004</code></td>
<td>取款失败（取款金额不正确）</td>
<td>ATM</td>
<td>P1</td>
<td>1、打开 ATM 验证程序；2、卡余额为：500</td>
<td>1、插入卡；2、输入密码；3、输入取款金额</td>
<td>卡：银行卡；密码：正确密码；取款金额：1</td>
<td>取款失败，提示：取卡金额不正确，只能取100或100的倍数</td>
</tr>
<tr>
<td><code>ATM_005</code></td>
<td>取款失败（AM余额不足）</td>
<td>ATM</td>
<td>P1</td>
<td>1、打开 ATM 验证程序；2、卡余额为：500；3、ATM余额为0</td>
<td>1、插入卡；2、输入密码；3、输入取款金额</td>
<td>卡：银行卡；密码：正确密码；取款金额：100</td>
<td>取款失败，提示：取款失败，提示故障</td>
</tr>
<tr>
<td><code>ATM_006</code></td>
<td>取款成功（取款业务）</td>
<td>ATM</td>
<td>P0</td>
<td>1、打开 ATM 验证程序；2、卡余额为：500；3、ATM余额为10000</td>
<td>1、插入卡；2、输入密码；3、输入取款金额</td>
<td>卡：银行卡；密码：正确密码；取款金额：100</td>
<td>取款成功，打印凭证，退卡</td>
</tr>
</tbody></table>
<h3 id="7-5-正交实验法"><a href="#7-5-正交实验法" class="headerlink" title="7.5 正交实验法"></a>7.5 正交实验法</h3><p>正交实验设计方法：是由数理统计学科中正交实验方法进化出的一种测试多条件多输入的用例设计方法，从大量的（实验）数据（测试用例）中挑选适量的，有代表性的点（例），从而合理地安排实验（测试）的一种科学实验设计方法。</p>
<p><strong>条件：</strong>因子</p>
<p><strong>取值：</strong>水平</p>
<p>正交实验设计方法步骤：</p>
<ol>
<li>分析需求获取因子及水平</li>
<li>根据因子及水平数选择正交表</li>
<li>替换因子水平，获取实验次数</li>
<li>细化输出测试用例</li>
</ol>
<h4 id="案例-——-网络兼容性测试"><a href="#案例-——-网络兼容性测试" class="headerlink" title="案例 —— 网络兼容性测试"></a>案例 —— 网络兼容性测试</h4><p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021448666.png" srcset="/img/loading.gif" lazyload alt="image-20240402144858515"></p>
<h4 id="案例-——-某银行交易系统的卡号查询功能"><a href="#案例-——-某银行交易系统的卡号查询功能" class="headerlink" title="案例 —— 某银行交易系统的卡号查询功能"></a>案例 —— 某银行交易系统的卡号查询功能</h4><p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021450015.png" srcset="/img/loading.gif" lazyload alt="image-20240402145002865"></p>
<h3 id="7-6-错误推荐法"><a href="#7-6-错误推荐法" class="headerlink" title="7.6 错误推荐法"></a>7.6 错误推荐法</h3><p><strong>错误推荐法：</strong>经过经验推测系统可能出现的问题。</p>
<p><strong>实现思想：</strong>根据经验列举出可能出现问题的清单，根据清单分析问题可能原因，推测发现缺陷。</p>
<p><strong>使用场景：</strong> 当项目用例都执行完毕，且BUG修复完成，离上线还有一段时间，在这段时间中可使用错误推荐法复测主要业务或测试未覆盖的功能。</p>
<h3 id="7-7-黑盒测试总结"><a href="#7-7-黑盒测试总结" class="headerlink" title="7.7 黑盒测试总结"></a>7.7 黑盒测试总结</h3><p><img src="https://uni-pic-bed.oss-cn-hangzhou.aliyuncs.com/blog2024/202404021430384.png" srcset="/img/loading.gif" lazyload alt="image-20240402143043310"></p>

                
              </div>
            
            <hr/>
            <div>
              <div class="post-metas my-3">
  
    <div class="post-meta mr-3 d-flex align-items-center">
      <i class="iconfont icon-category"></i>
      

<span class="category-chains">
  
  
    
      <span class="category-chain">
        
  <a href="/categories/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/" class="category-chain-item">软件测试</a>
  
  

      </span>
    
  
</span>

    </div>
  
  
    <div class="post-meta">
      <i class="iconfont icon-tags"></i>
      
        <a href="/tags/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/" class="print-no-link">#软件测试</a>
      
        <a href="/tags/%E9%BB%91%E7%9B%92%E6%B5%8B%E8%AF%95/" class="print-no-link">#黑盒测试</a>
      
    </div>
  
</div>


              
  

  <div class="license-box my-3">
    <div class="license-title">
      <div>软件测试笔记1| 基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法</div>
      <div>http://example.com/2024/03/31/软件测试笔记1-基本概念、主流技能、软测流程、测试用例、等价类划分法、边界值分析法、判定表法、错误推荐法/</div>
    </div>
    <div class="license-meta">
      
        <div class="license-meta-item">
          <div>作者</div>
          <div>蛋炒饭</div>
        </div>
      
      
        <div class="license-meta-item license-meta-date">
          <div>发布于</div>
          <div>2024年3月31日</div>
        </div>
      
      
      
        <div class="license-meta-item">
          <div>许可协议</div>
          <div>
            
              
              
                <a class="print-no-link" target="_blank" href="https://creativecommons.org/licenses/by/4.0/">
                  <span class="hint--top hint--rounded" aria-label="BY - 署名">
                    <i class="iconfont icon-by"></i>
                  </span>
                </a>
              
            
          </div>
        </div>
      
    </div>
    <div class="license-icon iconfont"></div>
  </div>



              
                <div class="post-prevnext my-3">
                  <article class="post-prev col-6">
                    
                    
                      <a href="/2024/04/05/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95%E7%AC%94%E8%AE%B02-%E8%BD%AF%E4%BB%B6%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E3%80%81%E7%BC%BA%E9%99%B7%E7%AE%A1%E7%90%86/" title="软件测试笔记2 | 软件生命周期、缺陷管理">
                        <i class="iconfont icon-arrowleft"></i>
                        <span class="hidden-mobile">软件测试笔记2 | 软件生命周期、缺陷管理</span>
                        <span class="visible-mobile">上一篇</span>
                      </a>
                    
                  </article>
                  <article class="post-next col-6">
                    
                    
                      <a href="/2024/03/28/%E9%9D%A2%E8%AF%95%E5%87%86%E5%A4%872-Vue2-%E5%92%8C-Vue3/" title="面试准备2 | Vue2 和 Vue3">
                        <span class="hidden-mobile">面试准备2 | Vue2 和 Vue3</span>
                        <span class="visible-mobile">下一篇</span>
                        <i class="iconfont icon-arrowright"></i>
                      </a>
                    
                  </article>
                </div>
              
            </div>

            
          </article>
        </div>
      </div>
    </div>

    <div class="side-col d-none d-lg-block col-lg-2">
      
  <aside class="sidebar" style="margin-left: -1rem">
    <div id="toc">
  <p class="toc-header">
    <i class="iconfont icon-list"></i>
    <span>目录</span>
  </p>
  <div class="toc-body" id="toc-body"></div>
</div>



  </aside>


    </div>
  </div>
</div>





  



  



  



  



  







    

    
      <a id="scroll-top-button" aria-label="TOP" href="#" role="button">
        <i class="iconfont icon-arrowup" aria-hidden="true"></i>
      </a>
    

    
      <div class="modal fade" id="modalSearch" tabindex="-1" role="dialog" aria-labelledby="ModalLabel"
     aria-hidden="true">
  <div class="modal-dialog modal-dialog-scrollable modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header text-center">
        <h4 class="modal-title w-100 font-weight-bold">搜索</h4>
        <button type="button" id="local-search-close" class="close" data-dismiss="modal" aria-label="Close">
          <span aria-hidden="true">&times;</span>
        </button>
      </div>
      <div class="modal-body mx-3">
        <div class="md-form mb-5">
          <input type="text" id="local-search-input" class="form-control validate">
          <label data-error="x" data-success="v" for="local-search-input">关键词</label>
        </div>
        <div class="list-group" id="local-search-result"></div>
      </div>
    </div>
  </div>
</div>

    

    
  </main>

  <footer>
    <div class="footer-inner">
  
    <div class="footer-content">
       <a href="https://hexo.io" target="_blank" rel="nofollow noopener"><span>博客网站基于Hexo</span></a> <i class="iconfont icon-love"></i> <a href="https://github.com/fluid-dev/hexo-theme-fluid" target="_blank" rel="nofollow noopener"><span>主题Fluid</span></a> 
    </div>
  
  
  
  
</div>

  </footer>

  <!-- Scripts -->
  
  <script  src="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.js" ></script>
  <link  rel="stylesheet" href="https://lib.baomitu.com/nprogress/0.2.0/nprogress.min.css" />

  <script>
    NProgress.configure({"showSpinner":false,"trickleSpeed":100})
    NProgress.start()
    window.addEventListener('load', function() {
      NProgress.done();
    })
  </script>


<script  src="https://lib.baomitu.com/jquery/3.6.4/jquery.min.js" ></script>
<script  src="https://lib.baomitu.com/twitter-bootstrap/4.6.1/js/bootstrap.min.js" ></script>
<script  src="/js/events.js" ></script>
<script  src="/js/plugins.js" ></script>





  
    <script  src="/js/img-lazyload.js" ></script>
  




  
<script>
  var relativeDate = function() {
    var updatedTime = document.getElementById('updated-time');
    if (updatedTime) {
      var text = updatedTime.textContent;
      var reg = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:Z|[+-]\d{2}:\d{2})/;
      var matchs = text.match(reg);
      if (matchs) {
        var relativeTime = moment(matchs[0]).fromNow();
        updatedTime.textContent = text.replace(reg, relativeTime);
      }
      updatedTime.style.display = '';
    }
  };
  Fluid.utils.createScript('https://lib.baomitu.com/moment.js/2.29.4/moment.min.js', function() {
    if (!'zh-cn'.startsWith('en')) {
      Fluid.utils.createScript('https://lib.baomitu.com/moment.js/2.29.4/locale/zh-cn.min.js', function() {
        relativeDate();
      });
    } else {
      relativeDate();
    }
  });
</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/tocbot/4.20.1/tocbot.min.js', function() {
    var toc = jQuery('#toc');
    if (toc.length === 0 || !window.tocbot) { return; }
    var boardCtn = jQuery('#board-ctn');
    var boardTop = boardCtn.offset().top;

    window.tocbot.init(Object.assign({
      tocSelector     : '#toc-body',
      contentSelector : '.markdown-body',
      linkClass       : 'tocbot-link',
      activeLinkClass : 'tocbot-active-link',
      listClass       : 'tocbot-list',
      isCollapsedClass: 'tocbot-is-collapsed',
      collapsibleClass: 'tocbot-is-collapsible',
      scrollSmooth    : true,
      includeTitleTags: true,
      headingsOffset  : -boardTop,
    }, CONFIG.toc));
    if (toc.find('.toc-list-item').length > 0) {
      toc.css('visibility', 'visible');
    }

    Fluid.events.registerRefreshCallback(function() {
      if ('tocbot' in window) {
        tocbot.refresh();
        var toc = jQuery('#toc');
        if (toc.length === 0 || !tocbot) {
          return;
        }
        if (toc.find('.toc-list-item').length > 0) {
          toc.css('visibility', 'visible');
        }
      }
    });
  });
</script>


  <script src=https://lib.baomitu.com/clipboard.js/2.0.11/clipboard.min.js></script>

  <script>Fluid.plugins.codeWidget();</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/anchor-js/4.3.1/anchor.min.js', function() {
    window.anchors.options = {
      placement: CONFIG.anchorjs.placement,
      visible  : CONFIG.anchorjs.visible
    };
    if (CONFIG.anchorjs.icon) {
      window.anchors.options.icon = CONFIG.anchorjs.icon;
    }
    var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
    var res = [];
    for (var item of el) {
      res.push('.markdown-body > ' + item.trim());
    }
    if (CONFIG.anchorjs.placement === 'left') {
      window.anchors.options.class = 'anchorjs-link-left';
    }
    window.anchors.add(res.join(', '));

    Fluid.events.registerRefreshCallback(function() {
      if ('anchors' in window) {
        anchors.removeAll();
        var el = (CONFIG.anchorjs.element || 'h1,h2,h3,h4,h5,h6').split(',');
        var res = [];
        for (var item of el) {
          res.push('.markdown-body > ' + item.trim());
        }
        if (CONFIG.anchorjs.placement === 'left') {
          anchors.options.class = 'anchorjs-link-left';
        }
        anchors.add(res.join(', '));
      }
    });
  });
</script>


  
<script>
  Fluid.utils.createScript('https://lib.baomitu.com/fancybox/3.5.7/jquery.fancybox.min.js', function() {
    Fluid.plugins.fancyBox();
  });
</script>


  <script>Fluid.plugins.imageCaption();</script>

  <script  src="/js/local-search.js" ></script>





<!-- 主题的启动项，将它保持在最底部 -->
<!-- the boot of the theme, keep it at the bottom -->
<script  src="/js/boot.js" ></script>


  

  <noscript>
    <div class="noscript-warning">博客在允许 JavaScript 运行的环境下浏览效果更佳</div>
  </noscript>
</body>
</html>
